#pragma once

#pragma once
// #include "vector"
#include "list"
#include "iostream"
#include "memory"

// #define mallocFor(Type) malloc(sizeof())
// template <

// template <typename ElemType>
// ElemType *mallocListNode();

template <typename ElemType>
struct ListNode
{
	ElemType value;
	// std::shared_ptr<ListNode<ElemType>> next;
	ListNode<ElemType> *next;
	// ListNode() {}

	//辅助检查代码问题
	~ListNode()
	{
		std::cout << "node value " << value << " destroyed\r\n";
	}
	void print2End()
	{
		ListNode<ElemType> *curNode = this;
	loop:
		if (curNode)
		{
			std::cout << curNode->value << ",";
			curNode = curNode->next;
			goto loop;
		}
		// if (curNode->next)
		// {

		// }
		std::cout << std::endl;
		//while()
	}
};

//无头节点链表构造
template <typename ElemType>
void initListByArr(ListNode<ElemType> *head, ElemType arr[], size_t arrLen)
{
	ListNode<ElemType> *curNode = head;
	//value = arr[0];
	curNode->value = arr[0];
	for (int i = 1; i < arrLen; i++)
	{
		curNode->next = mallocListNode<ElemType>(); //(ListNode<ElemType> *)malloc(sizeof(ListNode<ElemType>)); //std::make_shared<ListNode<ElemType>>();
		curNode = curNode->next;
		curNode->value = arr[i];
	}
}

template <typename ElemType>
ListNode<ElemType> *mallocListNode()
{
	auto ret = (ListNode<ElemType> *)malloc(sizeof(ListNode<ElemType>));
	ret->next = NULL;
	return ret;
	// ret
}
//template <typename ElemType>
//void printList(std::list<ElemType> &list)
//{
//    for (auto &i : list)
//    {
//        std::cout << i << ",";
//    }
//    std::cout << "\r\n";
//}

template <typename ElemType>
bool delElemX(
	ListNode<ElemType> *&L, ElemType x)
{
	while (L && L->value == x)
	{
		// L
		auto temp = L->next;
		free(L);
		L = temp;
	}
	if (!L)
	{
		return false;
	}
	auto lastNode = L;
	auto curNode = L->next;
	while (curNode)
	{
		if (curNode->value == x)
		{
			//当前删除，所以接到上一个节点
			lastNode->next = curNode->next;
			free(curNode);
			curNode = lastNode->next;
			//curNode->next = curNode->next->next;
		}
		else
		{
			//当前不删，所以上一个变成当前节点
			lastNode = curNode;
			//当前节点变成下一个节点
			curNode = curNode->next;
		}
	}
	//auto begin = L.begin();
	//while (begin)
	//{
	//if (begin == x)
	//{
	// L.
	//}
	//begin++;
	//}
	return true;
	// return false;
}

int main()
{
	std::cout << "hello \r\n";
	int arrA[] = {7, 7, 7, 4, 7, 5, 6, 2, 1, 3};
	int arrB[] = {-25, -10, 10, 11};
	int arrC[] = {2, 9, 17, 30, 41};

	//ListNode<int> a(arrA, sizeof(arrA) / sizeof(int));
	auto head = mallocListNode<int>(); //std::make_shared<ListNode<int>>(arrA, sizeof(arrA) / sizeof(int));
	initListByArr(head, arrA, sizeof(arrA) / sizeof(int));
	head->print2End();
	delElemX(head, 7);
	if (head)
	{
		head->print2End();
	}
	else
	{
		std::cout << "del 2 null";
	}
	//a.print2End();
	// std::vector<int> A =
	////     std::vector<int> B =
	//std::vector<int> A(arrA, arrA + sizeof(arrA) / sizeof(int));
	//// std::vector<int> B(arrB, arrB + sizeof(arrB) / sizeof(int));
	//// std::vector<int> C(arrC, arrC + sizeof(arrC) / sizeof(int));

	//printVec(A);
	//// printVec(B);
	//// printVec(C);
	//quickSortStart(A);
	//printVec(A);
	// std::vector<int> vec1; // vec2, vec3;
	// int arr[100];
	// std::cout << "hello"
	//           << "\r\n";
	// //init data
	// for (int i = 0; i < 100; i++)
	// {
	//     arr[i] = i;
	// }
	// leftMoveArr(arr, 100, 30);

	// // fastFind(vec1, 9);
	// for (int i = 0; i < 100; i++)
	// {
	//     std::cout << arr[i] << ",";
	// }
	// std::cout << "\r\n";
	// for (int i = 0; i < vec2.size(); i++)
	// {
	//     std::cout << vec2[i] << ",";
	// }
	// std::cout << "\r\n";
	// ///////////////////////////////////////////////////
	// combineAB2C(vec1, vec2, vec3);
	// for (int i = 0; i < vec3.size(); i++)
	// {
	//     std::cout << vec3[i] << ",";
	// }
	// std::cout << "\r\n";
	return 0;
}